<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .container {
        display: flex;
        /* 两端对齐 */
        justify-content: space-between;
        flex-wrap: wrap;
      }
      .list {
        width: 24%;
        height: 100px;
        background-color: skyblue;
        margin-top: 15px;
      }

      /*1. 如果最后一行是3个元素 */
      .list:last-child:nth-child(4n - 1) {
        /* 如果最后一行是3个元素,那么最后一个元素的 margin-right 就是 列表宽度 24% + 应该本来应该等分的 间隙大小 4% / 3 */
        margin-right: calc(24% + 4% / 3);
      }

      /*2. 如果最后一行是2个元素 */
      .list:last-child:nth-child(4n - 2) {
        /* 如果最后一行是2个元素, 那么最后一个元素的 margin-right 就是 两个列表宽度 + 两个本来应该等分的间隙大小.  */
        /* 所以 calc()的表达式应该为 48% + (4% / 3)*2 实际上也就是 =   calc(48% + 8% / 3)*/
        /* margin-right: calc(48% + 8% / 3); */
        margin-right: calc(48% + (4% / 3) * 2);
      }

      /* 3. 如果最后一行是一个元素, 就不需要再考虑, 
      因为本来 justify-content: space-between; 就是靠两端对齐, 所以就没有必要考虑只剩下一个元素的情况了. */
    </style>
  </head>
  <body>
    <h3 style="color: red">根据元素个数,最后一个元素动态margin</h3>
    <p>方法二：根据个数最后一个元素动态margin</p>
    <p>
      由于每一行的数目都是固定的，因此，我们可以计算出不同个数列表应当多大的margin值才能保证完全左对齐。
      例如，假设每行4个元素，结果最后一行只有3个元素，则最后一个元素的margin-right大小是“列表宽度+间隙大小”的话，那最后3个元素也是可以完美左对齐的。
      然后，借助树结构伪类数量匹配技术（这篇文章“伪类匹配列表数目实现微信群头像CSS布局的技巧”中的布局技巧就是借助这种技术实现），我们可以知道最后一行有几个元素。
      例如： .list:last-child:nth-child(4n -
      1)说明最后一行，要么3个元素，要么7个元素…… .list:last-child:nth-child(4n -
      2)说明最后一行，要么2个元素，要么6个元素……
      在本例中，一行就4个元素，因此，我们可以有如下CSS设置：
    </p>
    <div class="container">
      <div class="list"></div>
      <div class="list"></div>
      <div class="list"></div>
      <div class="list"></div>
      <div class="list"></div>
      <div class="list"></div>
      <!-- <div class="list"></div> -->
    </div>
  </body>
</html>
